#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;

//面试题1：赋值运算符函数
class CMyString
{
public:
    CMyString(char* pDate = nullptr) {
        if (pDate != nullptr) {
            delete[] m_pDate;
            this->m_pDate = new char(strlen(pDate)+1);
            strcpy(m_pDate, pDate);
        }
        else {
            m_pDate = pDate;
        }
    }
    CMyString(const CMyString& str) {
        if (str.m_pDate != nullptr) {
            delete[]m_pDate;
            this->m_pDate = new char(strlen(str.m_pDate)+1);
            strcpy(m_pDate, str.m_pDate);
        }
        else {
            m_pDate = nullptr;
        }
    }
    ~CMyString(void) {
        if (m_pDate != NULL) {
            delete[]m_pDate;
        }
    }

    CMyString& operator=(const CMyString& str);
private:
    char* m_pDate;
};


//在C++函数中不能存在复制构造函数传值，会出现递归调用的问题，最后栈溢出


//CMyString& CMyString::operator=(const CMyString& str)
//{
//	if (&str == this) {
//		//判断是否是同一个实例
//		return *this;
//	}
//	delete[]m_pDate;
//	m_pDate = new char[strlen(str.m_pDate) + 1];
//	strcpy(this->m_pDate, str.m_pDate);
//	// TODO: 在此处插入 return 语句
//	return *this;
//}

int main() {
    //进行代码的测试
    char* ch = new char(10);
    int i = 0;
    char c = 'a';
    for (i = 0; i < 9; ++i) {
        *(ch+i) = 'a';
    }
    ch[i] = '\0';
    CMyString str1 = ch;
    CMyString str2;
    str2 = str1;

    delete ch;
    return 0;
}

//这样可以解决异常安全性问题？先delete pDate再new pDate，当new时候出现内存空间不足，就会出现异常，但是此时PData已经发生改变，所以出来问题
//生成一个新的类，接受一个新值，然后旧类与新类交换，在函数释放的时候，自动delete掉旧值
CMyString& CMyString::operator=(const CMyString& str)
{
    if (&str != this) {
        CMyString temp(str);

        char* pDatetemp = temp.m_pDate;
        temp.m_pDate = this->m_pDate;
        this->m_pDate = pDatetemp;
    }
    // TODO: 在此处插入 return 语句
    return *this;
}



